/* 
 * UtilDate.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * Classe utilitária para tratamento de datas.
 *
 * @author Ludemeula Fernandes de Sá
 */
public class UtilDate {
	public static final Locale BRAZIL = new Locale("pt","BR");
	public static final Locale USA = new Locale("en","US");
	public static final long DAY = 24 * 3600 * 1000;
	
	/**
	 * Formata a data no padrão Brasileiro dd/MM/yyyy.
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDateBrazil(Date date) {
		return formatDate(date, "dd/MM/yyyy");
	}

	/**
	 * Formata a data no padrão americano yyyy-MM-dd HH:mm:ss.
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDateUSA(Date date) {
		if (date != null) {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", USA);
			return format.format(date);
		} else {
			return "";
		}
	}

	/**
	 * Formata a data no padrão informado.
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDate(Date date, String pattern) {
		if (date != null) {
			SimpleDateFormat format = new SimpleDateFormat(pattern, BRAZIL);
			return format.format(date);
		} else {
			return "";
		}
	}

	/**
	 * Gera um date de uma string de data no formato Brasileiro.
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDateBrazil(String date) {
		return getDate(date, "dd/MM/yyyy");
	}

	/**
	 * Gera um date de uma string de data no formato informado.
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date getDate(String date, String pattern) {
		SimpleDateFormat format = new SimpleDateFormat(pattern, BRAZIL);
		try {
			return format.parse(date);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * Gera um date de uma string de data no formato informado (USA).
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date getDateUSA(String date, String pattern) {
		SimpleDateFormat format = new SimpleDateFormat(pattern, USA);
		try {
			return format.parse(date);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * Gera uma string de um date no formato informado.
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String getDate(Date date, String pattern) {
		SimpleDateFormat format = new SimpleDateFormat(pattern, BRAZIL);
		return format.format(date);
	}

	/**
	 * Gera um date de uma string de data no formato americano.
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDateUSA(String date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", USA);
		try {
			return format.parse(date);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * Retorna um calendar a partir de um Date
	 * 
	 * @param date
	 * @return
	 */
	public static Calendar getCalendar(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);	
			
		return cal;
	}
	
	/**
	 * Retorna um date com o primeiro dia do mês.
	 * 
	 * @param date
	 * @return
	 */
	public static Date getPrimeiroDiaMesAtual(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);	
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
		cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
		
		return cal.getTime();
	}
	
	/**
	 * Retorna um date com o último dia do mês.
	 * 
	 * @param date
	 * @return
	 */
	public static Date getUltimoDiaMesAtual(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);		
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
		cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
		
		return cal.getTime();
	}
	
	/**
	 * Retorna um date com o último dia do mês anterior.
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date getUltimoDiaMesAnterior(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);
		cal.add(Calendar.MONTH, -1); 
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
		cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
		
		return cal.getTime();
	}
	
	/**
	 * Retorna um date com 30 dias anterior a data
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date getTrintaDiasAnteriores(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);
		cal.add(Calendar.DATE, -30);
		cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
		cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
		return cal.getTime();
	}
	
	/**
	 * Retorna um date com o último dia do mês anterior.
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static Date getPrimeiroDiaMesPosterior(Date date) {		
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);
		cal.add(Calendar.MONTH, 1); 
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
		cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
		
		return cal.getTime();
	}
 
    /**
     * Retorna se o a data informada é uma sexta-feira.
     * 
     * @param date
     * @return
     */
    public static Boolean isSextaFeira(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	int mes = calendar.get(Calendar.DAY_OF_WEEK);
    	return mes == 6;
    }

    /**
     * Retorna se o a data informada (Hoje) é uma sexta-feira.
     * 
     * @param date
     * @return
     */
    public static Boolean isSextaFeira() {
    	return isSextaFeira(new Date());
    }

    /**
     * Valida se uma string tem um valor numérico.
     * 
     * @param str
     * @return
     */
    public static boolean isInteger(String str) {
        return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
    }
    
    /**
     * Retorna o mês e ano de uma data Ex.: Junho/13
     * 
     * @param str
     * @return
     */
    public static String getMesAno(Date data) {
    	DateFormat dfmt = new SimpleDateFormat("MMMM/yy", BRAZIL);
    	return dfmt.format( data ) ;    	
    }
}